{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# SCARF demo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The autoreload extension is already loaded. To reload it, use:\n",
      "  %reload_ext autoreload\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from collections import defaultdict\n",
    "\n",
    "from ms_pred import common\n",
    "from ms_pred.common.plot_utils import *\n",
    "import ms_pred.scarf_pred.scarf_model as scarf_model\n",
    "\n",
    "set_style()\n",
    "\n",
    "%load_ext autoreload\n",
    "%autoreload 2"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Get single example from NIST20\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcIAAACWCAIAAADCEh9HAAAABmJLR0QA/wD/AP+gvaeTAAAfGklEQVR4nO3de1gV5b4H8O9aIIiIiuAFlbyDgAop4l1TSbJQa5d2XZpadnSzgdwKmhWY+xjKyUCzfdCThbY7pWc/jy5MzVtooqII5oVroKCGaAqKINf1nj9mWiByZ2bedfl9Hv9YLd8189trO9/1zsw776tijIEQQkhrqXkXQAghxo1ilBBC2oRilBBC2oRilBBC2oRilBBC2sT4YvTHH388fvw47yoIIURkybuAltm9e/fcuXNdXV0vXrxoZWXFuxxCCDG23uhLL700dOjQjIyMTZs28a6FEEIAQGV0w++PHDny7LPP2tnZZWRkODk58S6HEGLujKw3CsDX13f27NnFxcUffPAB71oIIcQIe6MAcnJyPDw8ysvLT506NWbMGN7lEELMmvH1RgEMGDBg2bJljLGAgACdTse7HEKIWTPK3iiA0tJSNze3vLy87du3L1iwgHc5hBDzZawxCuC777578803u3fvnpmZ2blzZ97lEELMlFGe1AveeOONyZMn3759e+3atbxrIYSYLyPujQK4cOGCt7e3SqVKSUkZOnQo73IIIebIiHujALy8vN59992qqqr333+fdy2EEDNl3L1RAPfu3XNxcbl79+6ePXtmz57NuxxCiNkx7t4ogK5du4aHhwNYtmxZWVkZ73IIIWbH6GMUwJIlSzw9PXNycj777DPetRBCWiIvD2vXYuJE9O6N9u3RuTNcXPDmm/j+e1RX121cUYExYzBmDCIjG9vmli1is/v35Su8NqM/qRecPHly0qRJNjY2qampffv25V0OIaQpOh3CwxEZiYZOIt3c8PXXGD265p2yMtjYAMCSJfjyywa3HBIi5uydO3B0lLDkhphCbxTAhAkTXnnlldLS0lWrVvGuhRDSFMYwbx7WrkVZGTp1QlAQ9u5FYiKOH0dMDJ55BgDS0jBtGo4e5VxqczBTkZeXZ2trCyA+Pp53LYSQRkVHM4ABzMeH5efX0+Cbb5ilJQNYjx6soEB889Ej8VNLljS28RUrxGZ37khfeX1MpDcKwNnZecWKFQCCg4Orn7yqQggxEA8e4MMPAcDJCQcPomfPetrMn48NGwCgoADr1ilaXsuZTowCCAkJ6d+//4ULF7Zt28a7FkJI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",
      "text/plain": [
       "<rdkit.Chem.rdchem.Mol at 0x7f819ec439a0>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sample_labels = \"../data/spec_datasets/sample_labels.tsv\"\n",
    "test_df = pd.read_csv(sample_labels, sep=\"\\t\")\n",
    "\n",
    "# Get first entry from test_df for smiles and ionization\n",
    "test_smiles = test_df.iloc[0][\"smiles\"]\n",
    "test_ionization = test_df.iloc[0][\"ionization\"]\n",
    "\n",
    "test_smiles = \"InChI=1S/C7H15NO3/c1-8(2,3)5-6(9)4-7(10)11/h6,9H,4-5H2,1-3H3/p+1\"\n",
    "test_smiles = \"C[N+](C)(C)CC(CC(=O)O)O\"\n",
    "test_ionization = \"[M+H]+\"\n",
    "Chem.MolFromSmiles(test_smiles)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Load models (run quickstart/scarf/download_models.sh first to download)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Get best models\n",
    "\n",
    "inten_ckpt = f\"../quickstart/scarf/models/canopus_weave_model.ckpt\"\n",
    "gen_ckpt = f\"../quickstart/scarf/models/canopus_thread_model.ckpt\"\n",
    "\n",
    "gen_model_obj = scarf_model.ScarfNet.load_from_checkpoint(gen_ckpt)\n",
    "inten_model_obj = scarf_model.ScarfIntenNet.load_from_checkpoint(inten_ckpt)\n",
    "\n",
    "# Build joint model class\n",
    "model = scarf_model.JointModel(\n",
    "    gen_model_obj=gen_model_obj, inten_model_obj=inten_model_obj\n",
    ")\n",
    "model.eval()\n",
    "model.freeze()\n",
    "model = model.to(\"cpu\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/mnt/home/samlg/miniforge-pypy3/envs/ms-gen-pred/lib/python3.8/site-packages/dgl/backend/pytorch/tensor.py:44: UserWarning: The given NumPy array is not writeable, and PyTorch does not support non-writeable tensors. This means you can write to the underlying (supposedly non-writeable) NumPy array using the tensor. You may want to copy the array to protect its data or make it writeable before converting it to a tensor. This type of warning will be suppressed for the rest of this program. (Triggered internally at  /opt/conda/conda-bld/pytorch_1631630839582/work/torch/csrc/utils/tensor_numpy.cpp:180.)\n",
      "  return th.as_tensor(data, dtype=dtype)\n"
     ]
    }
   ],
   "source": [
    "# Predict example entry\n",
    "# Model predict takes both a smiles string and an ionization\n",
    "output = model.predict_mol(\n",
    "    test_smiles,\n",
    "    threshold=0,\n",
    "    device=\"cpu\",\n",
    "    max_nodes=300,\n",
    "    adduct=test_ionization,\n",
    "    binned_out=False,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Add adduct in \n",
    "new_masses = [i + common.ion2mass[test_ionization] for i in output['masses']]   \n",
    "output['masses_charged'] = new_masses"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Output contents: \n",
    "\n",
    "1. spec: Intensities paired to each formula\n",
    "2. forms: String formulae\n",
    "3. masses: Masses of chem formula"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Below we show how to sum all intensities according to mz in order to generate a single spectrum. Note that if binned predictions are desired, the model should be adjusted by setting \"binnned_out=True\", which will be more accurate, as it uses attentive pooling. Here we take a heuristic explanation for each peak and take _max_ pooling over formulae with equivalent masses."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Convert from frags dict into a list of mz, inten\n",
    "mass_to_obj = defaultdict(lambda: {})\n",
    "for m, i, form in zip(output['masses_charged'], output['spec'], output['forms']):\n",
    "    if i <= 0:\n",
    "        continue\n",
    "    cur_obj = mass_to_obj[m]\n",
    "    if i > cur_obj.get(\"inten\", 0):\n",
    "        cur_obj[\"formula\"] = form\n",
    "        cur_obj[\"inten\"] = i\n",
    "\n",
    "max_inten = max(*[i[\"inten\"] for i in mass_to_obj.values()], 1e-9)\n",
    "mass_to_obj = {\n",
    "    k: dict(inten=v[\"inten\"] / max_inten, formula=v[\"formula\"])\n",
    "    for k, v in mass_to_obj.items()\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(103.099165456, {'inten': 1.0, 'formula': 'C5NOH12'}),\n",
       " (102.091340424, {'inten': 0.88081044, 'formula': 'C5NOH11'}),\n",
       " (85.064791328, {'inten': 0.41944608, 'formula': 'C5OH8'}),\n",
       " (99.067865328, {'inten': 0.19598472, 'formula': 'C5NOH8'}),\n",
       " (100.07569036, {'inten': 0.17955087, 'formula': 'C5NOH9'}),\n",
       " (58.065125675999994, {'inten': 0.1304368, 'formula': 'C3NH7'}),\n",
       " (60.08077573999999, {'inten': 0.11260316, 'formula': 'C3NH9'}),\n",
       " (44.049475611999995, {'inten': 0.11138921, 'formula': 'C2NH5'}),\n",
       " (70.065125676, {'inten': 0.1027039, 'formula': 'C4NH7'}),\n",
       " (71.072950708, {'inten': 0.07412808, 'formula': 'C4NH8'})]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sorted(list(mass_to_obj.items()), key = lambda x: x[1][\"inten\"], reverse=True)[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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5ky7ng8//ND4+/sXe87tt9/uUvwAPBvDJgHAw11yySW64IILtGfPHp09e1ZffvmlRo8eXWDZP//8U999950kydfX1+meuZLy9fVVjx491KNHD0VGRio0NFQpKSnav3+/vv76ax04cECSlJCQoOuvv14//fRToUP3jDEaOXKkfv/9d/uxVq1a6aqrrlLr1q0VEhKilJQUHTt2TD///LOio6Ptdb0Ksnz5cj322GP2fo0aNXTllVeqe/fuatCggSzLUlxcnPbv36+ffvpJ27ZtK3U75JV3xs/ly5fr/vvvL7f688rOztaYMWO0e/duSVLfvn01dOhQnXfeeTp27Ji+/vprbdq0yS573333qW7duoW+RnItWLBA48aNc1qbrmvXrhoyZIiaN2+urKws7dq1S5988olOnTolSXrllVfk5+enF198sci6ly5dqmuvvdZpqYr69evrqquuUseOHRUWFqbExET9+uuvWrt2rX755Zd8ddSuXVstW7aUJB06dEiZmZmSpLCwMIWHhxf4vMUNtX3wwQf15ZdfSpI6duyo4cOHKzIyUunp6dq7d68CAgKKPL8izZ07V//6178kSRdddJFGjBihpk2bKjExUStXrtS3335rl/373/+u/v3769ixY5owYYKysrLUuHFj3XDDDWrbtq18fHy0ZcsWffjhh/bv4J133tGVV16pESNGuOX6AJQTd2ePAID/KajnzRhjpk+fbj92+eWXF3r+tGnT7HJXXXWV/XhJet4aNmxoXnrpJXPs2LFCy2RlZZk333zT6Rv/vn37Flo+by/DtGnTihzGlZGRYb7++mvz2GOPFXi8X79+dl0tW7Y0v//+e5HX9Oeff5onnnjCbN68uchyroiLizO+vr5O1/P888+b7OzsMtedy7HnzcfHx0g5w98+//zzAst/9NFHTr+L8PBwc+LEiULr37NnjwkKCnIqv2TJkgLLnj171owYMcIua1mWiY6OLrTuQ4cOmfDwcKfyTz75pElJSSn0nN27d5uJEyeadevWFXi8efPmdn1PP/10ofXkVVDvnZ+fn5k1a1axv6/K7nmzLMuOrSBz5851Kn/99debZs2aGUnmrrvuKrB9d+zYYUJDQ+1zunbt6tI1APBcJG8A4EEKS96OHz9u/Pz87A/zBd27lZ2d7XQfz6effmofK0nyVtywTEdvvvmmU7w7d+4ssNxTTz1ll7noootcrr8gaWlpTsnTl19+Wab6SmPUqFH5koI2bdqYadOmmU2bNpm0tLQy1e+YvOX+LFy4sMhzZs+e7VS+qCGOAwYMsMsFBQWZHTt2FFl3RkaG6dmzp31OVFRUoWVHjhzpFEd53BNYnsmbq/FUdvImybz++utF1n311VfnO2fUqFFFnjNjxgyn8vv373fpOgB4JpYKAAAvkDvkTMoZGjdnzpx8ZaKjo+2hjPXq1dPVV19dqucqyQySd955p9NMgXkXrc517Ngxe7tNmzaliivXqVOnnIb6lbW+0pg+fboiIiKcHtu/f7+mTJmiSy65RLVq1VK3bt1011136cMPP9Thw4fL9HyXXXaZRo0aVWSZv/3tb+rRo4e9P2/ePKdhi7m2b9+uNWvW2PtPPvmkLrzwwiLr9vPz0+uvv27vr1u3Trt27cpX7uDBg/rss8/s/WHDhunOO+8ssu7KdNFFF+mOO+5wdxgF6tChg+65554iy9xyyy1O+/7+/nrllVdKdM7mzZtLFyAAj0DyBgBeYuLEifb2nDlzZIxxOu64ttvYsWPl7+9f4TH5+PhowIAB9v5PP/1UYLmgoCB7e8uWLcrIyCj1czrWJUkbNmwodV2l1bRpU33//ffq3LlzgcfT09O1detWvf322xo3bpyaN2+unj176v3333dKPF3lasIxadIke/v06dMFts38+fPt7Ro1ahSbMOTq3r272rdvb++vXLkyX5nPPvvM6foeffRRl+quLOPHjy+3JSPK2y233FJsbF27dnXaHzRokBo2bFjkOfXr11eTJk3s/X379pU+SABuR/IGAF7iyiuvtHt7Dhw4oO+//94+Fh8fr88//9zed0z0Kprjh8fY2NgCyzh+6Dxw4IBGjx6tv/76q1TPV6dOHafevn/84x9avHixsrOzS1VfabVp00Zbt27Ve++9py5duhRb/scff9Rtt92mCy+8UHv27CnRcw0ePNilckOGDHHaLyiZXrt2rb0dFRVVovX0HHv2CurBcay7QYMG6t27t8t1V4ZLL73U3SEUqmfPnsWWadCgQYnPkeTUS1zUREAAPB/JGwB4CT8/P6chUB988IG9/fHHH+vcuXOSpG7duqlTp05lfr4DBw7oueee04gRI9S6dWuFh4fL399flmU5/eTOkCcV/sHwuuuuc5ql8fPPP1dkZKQGDhyoF154QRs3blR6errLsTkOxUtISNDIkSPVtGlT3XnnnVq0aFGpE8OS8vPz08SJE7Vt2zb9+uuvmjlzpm6++Wa1a9dOvr6+BZ6ze/du9erVq8AZFgvStGlT1alTx6WyTZo0cSpbUC/Lzp077e2SLuztmDwU1MaOSWlxi8m7Q6tWrdwdQqHyDsMtSHBwsNN+3mTOlfOSk5NLFhgAj0LyBgBexLFH7dNPP1ViYqIk6f333y+wTGmcPn1aEyZMUKtWrfT4449ryZIl+v3333X27Fl7uvbCpKamFvh4SEiIFi5cqJCQEPuxrKwsrV69Wo8++qguvfRShYWF6YorrtDbb79dbO/AAw88oOHDhzs9duTIEc2aNUujR49W06ZN1bp1a9177732NPoVrU2bNrrrrrs0f/587d27VwkJCfruu+80efJk1atXz6lsbsLpyhDK+vXrlygOxyT57NmzTseSk5Od7oN7/fXX8yXjRf04LhGQt24p57WTq7jhfO5Qkl7GylaSe03Lck7e4dYAvAvJGwB4kXbt2qlXr16SpJSUFC1atEi7du2yh8fVrFlTN910U6nrP3nypPr27au5c+fm+5Dn6+ur+vXrq2nTpmrZsqX9ExYWZpcp6oPhZZddpq1bt+r6668vsFcqJSVFK1as0F133aXmzZtr+vTphdbn6+urL7/8Um+++aaaNWtWYJnff/9db775pnr16qX+/fvr119/daUJyk1QUJAGDhyol19+WTExMfnuLdu3b58WL15cbD2BgYElel7HXpakpCSnY+U5ZC4lJSXfY7lfJkhyStQ9hZ8fy9sC8G78FQMAL3Pbbbdp48aNknJ63HIXb5Zyhie6OsSuIPfff7/T0LdevXrprrvuUlRUlJo1a1Zg0vX0009r2rRpLtXfpk0bffrppzp27Ji+/fZbRUdHa/369fYsmbkSEhL08MMPa/fu3QXOrCnlTJZy9913684779TatWv13Xffad26ddq8ebM9hDTX999/rx49emjt2rWFTjJSkYKDg/XGG2/o1KlTWrRokf34N998U+xi2nmvpTiOw+LyJlB5J3s577zzSt0b5TgJhuPz5SaIeRNHAEDZkbwBgJcZNWqU/v73vys5OVkbN250mrL91ltvLXW9x44d08cff2zvjx07VnPnzpWPT9GDNErTmxMREaGJEyfaQzz//PNPffPNN5o7d67TMMe5c+fqxhtvtJdJKIiPj4/69eunfv36ScqZ6XH9+vX67LPP9OGHHyohIUFSTkJ42223FTojZmV46KGHnJI3V2b+O3HiRIme4+TJk/a2Y6+olDPZi6+vrz1cc/LkyXrsscdKVH9R6tata78ejh49Wm71ukNpZ6UsqEcSAMoLwyYBwMuEhIToxhtvtPdzh6o1b95cAwcOLHW9q1evtocpWpalF154odjETVK+XrPSyJ1sZOPGjfrPf/7jdOyjjz4qUV01atTQgAED9MYbb+i3335T27Zt7WNbtmyp9OGTjvJOEBIfH1/sOX/++afLCXJsbKxTWcdrl3J+r46POfbaloeOHTva21u2bCnXuitb3l5KV5Oy48ePV0Q4ACCJ5A0AvFJBk5JMmDChTGtYOU7zf95556lRo0bFnpOWlqZ169aV+jkL8n//939Oi0aXdFp9R/Xr19fzzz/v9FhZ6iurvBO6hIeHu3TeihUrXCq3bNkyp/3u3bvnK+O4Lt+yZcuKnYSmJPr27WtvHz9+XOvXry+Xeh3XLKysJSFCQ0Od/j8VtgxGXpU1QQ6A6onkDQC8UJ8+fXTFFVfowgsvtH8mTJhQpjodJwdxnJGwKHPnzq2QdaMce4fKsqB33rrKo76yyJvMuDp1/ezZs10q9+6779rbdevWLXCdNcd77E6fPu1y3a644YYbnCYFeeGFF8qlXsd791zprSwPNWrUcFpPsKB17fL6888/tXr16ooMC0A1R/IGAF5q2bJl2rFjh/0TGRlZpvocZ22Mj493WnC5IAcPHtQjjzziUt0xMTEux2GMcVoDLe91nTlzxmlWw+I4rmtWUH0ltWnTJk2ZMqXAqfKLkpqaqqeeesrpsWHDhrl07nfffadPP/20yDIffPCBU6/PuHHjFBAQkK9cVFSU+vTpY+8/8sgj+dqoOJmZmQUuc9CsWTOnIb3//e9/9fbbb5eo7oI4/s4c7/GsaI6LYH/22WdF/s6NMbr77rvLtScTAPIieQMASMqZyt+x12TixImFJl3r169X3759FRcX59J9cbfeeqv69u2rRYsWFXnvUGZmph588EHt3bvXfuyaa65xKvPzzz+rWbNmevTRR4u9Z+uXX37Rgw8+aO83bty4zItHJyUl6Z///KciIyN1zz33uNQjs2fPHg0cOFDbt2+3H2vbtq2uu+66Ys/Nbd/x48frq6++KrDMxx9/7LRweXh4eJETkbz11lt2b1ZiYqL69u2rOXPmFLvu3MGDB/Xcc88pMjLSaWIUR9OnT3da1+7uu+/WlClTipw189dff9WkSZO0YcOGAo9fcskl9nZ0dLQWLVpUKeuV3XzzzfZ2XFycJkyYUOBahgkJCbrlllv09ddfl2noMgAUh9kmAQCScu4Pu+222zRr1ixJOeukdejQQSNHjlT37t1Vs2ZNHT16VN99952io6Ml5UwXP3z4cL311ltF1m2M0dq1a7V27VoFBwerV69e6tatmxo1aqTatWsrOTlZ+/bt05IlS3To0CH7vM6dOxc4g2ZcXJxeeOEFvfDCC2rTpo0uueQSdejQQeHh4fLx8dGxY8e0YcMGLVu2zCkhefnll11KNl2RkJCgmTNnaubMmYqIiNAll1yizp0767zzzlOtWrWUkpKigwcPav369dq4caNTshESEqI5c+aoRo0axT5P79695efnpzVr1uiaa65Rv379NHToUJ133nk6fvy4vv76a6ekx7Isvfnmm06LdefVoUMHffjhhxo1apTS09OVkJCgW2+9VU899ZSuuOIKdezYUXXq1FFaWprOnDmjffv2acuWLS7dL9i4cWPNnz9fV199tdLS0mSM0T//+U/NmjVLw4YNU8eOHRUWFqbExET99ttvWr9+vbZt2yZJGjNmTIF1jhkzRk8//bTS0tKUnZ2t0aNH64477lCTJk2cvnCYNm2arr766mJjdNWVV16pHj166Mcff5QkLVmyRO3atdOYMWPUsmVLnTt3Tj///LM+++wznT59WrVq1dKdd96p6dOnl1sMAODEAAA8xgcffGAk2T+//PJLudRbt25du87x48cXWi45Odn07NnTKYbCfho1amS2bt1qnn76afux5s2bF1hvv379XKrT8efCCy80R44cyVfXmjVrSlyXr6+vee2118qlLdeuXWt8fHxKHEPuT8uWLc3GjRuLfI7x48fb5fv162eOHj1qOnToUGzdPj4+5vXXX3f5WtatW2ciIiJKdR3Hjx8vtp3OO++8EtW5Zs2aQuv74IMPjL+/f5Hnf/DBB/nOcTxeGvv27XOpjWrXrm2WL1/u8nPmfR0fPHjQpXiKut7COP7/K+r/PwDPx7BJAIAtKChI0dHRevDBB/NNlZ4rODhYt956q37++Wd17drVpXqfffZZ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k7Rjx47yuQAAAAAAHsPjlgo4ffq0+vfvrz179sgYI8uyypSAWZalrKyscozQNYcOHVL//v0VExMjSQoKClJWVpbS0tIkSV26dNGqVasUFhZWonrT0tJ044036r///a/9WEhIiNLT0+2E0MfHRzNmzNDkyZPL52JcwFIBAABPxlIBAMqLOz/3etywyYceeki7d++WZVmScpKvfv366ZJLLlHjxo3tP7SeLCsrS8OHD1dMTIwaNmyoefPmadCgQcrOztbixYs1adIkbd++XWPGjNG3335borr//e9/24nb3Xffrccff1yNGzdWdna2tm/frvvvv1/r1q3TAw88oD59+qhbt24VcYkAAAAAKplH9bydPn1aDRo0sHvaLrroIi1YsEBt27Z1c2Ql89577+lvf/ubJGnDhg3q1auX0/GPP/5YN998syTpu+++08CBA12uu0WLFoqJiVG/fv0UHR2d73h8fLyaNGmipKQkPfroo3ruuedKfyElQM8bAMCT0fMGoLywSPf/t2bNGmVnZ8sYo3r16um7777zusRNkubOnStJGjBgQL7ETZJGjx6tFi1aSJLmzZtXorqPHj0qSYX2qIWGhqpNmzaS/vfmBAAAAMD7eVTy9tdff0nKGSo5duzYEt8P5glSUlK0fv16SdLQoUMLLGNZloYMGSJJWrFiRYnqP//88yVJW7duLfB4fHy89u/fL6nwBA8AAACA9/Go5M1xYpELLrjAjZGU3t69e5WdnS1J6tixY6Hlco8dO3ZMZ86ccbn+u+66S5IUHR2te+65R7GxsZIkY4y2bdumYcOGKSkpSZdcconGjBlT2ssAAAAA4GE8Knlr0qSJvZ2RkeHGSErvyJEj9nbjxo0LLed4zPGc4txzzz16+OGH5ePjo5kzZ6pJkyaqVauWatasqYsvvli///67Hn30Ua1evVp+fuUzH02dOnWK/YmPjy+X5wIAAABQMI9K3hyH+e3bt8+NkZReYmKivR0UFFRoOcdjjucUx8fHR88995zef/99pxutc5cJSE1NVXx8fIkXMwcAAADg2TwqeWvZsqX69u0rY4y++OILr+19q0inTp3SwIEDNWHCBPXq1Uvr1q1TXFycjh49qs8//1znnXee3nrrLfXs2dMeUllWcXFxxf6EhoaWy3MBAAAAKJhHJW+S9MorryggIEB//fWXnnzySXeHU2K1atWyt1NSUgot53jM8ZzijB8/XtHR0erXr5+WL1+u3r17KzQ0VBEREbr22mu1bt061atXTwcOHNCjjz5auosAAAAA4HE8Lnnr0qWLZs+eLT8/P82YMUP333+/zp075+6wXNaoUSN7u6ieL8djjucUZe/evfai3g888IC9kLmj+vXra9y4cZKkzz//XB60jB8AAACAMiifGS3K0Q8//KBmzZrpiSee0LRp0/T666/ro48+0siRI3XJJZcoIiJCNWvWLFGdffv2raBo82vfvr18fHyUnZ2tXbt2FbpcwK5duyRJERERCg8Pd6nuPXv22NstW7YstFzr1q0l5fTunThxQg0aNHA1fAAAAAAeyuOSt/79+zv1KBljdObMGc2aNUuzZs0qcX2WZSkzM7M8QyxSUFCQevfurbVr12rZsmV66KGH8pUxxmj58uWSpMGDB7tct4/P/zpKDx06VOhyCsePH7e3cyc1AQAAAODdPG7YZF6WZeVL5lz5cSxb2caPHy9JWrNmjTZv3pzv+OLFi3XgwAFJsoc4uqJr16729ltvvVVgmeTkZM2bN0+S1LlzZwUHB7tcPwAAAADP5ZHJW3FJmat1uMv48ePVqVMnGWN0/fXXa9WqVZKk7OxsLV68WJMmTZIkDR06VAMHDnQ6d+rUqXbCGhMT43SsefPmGj58uCTpv//9r2655Rb98ccfMsYoIyNDGzZsUP/+/e3E8IEHHqjgKwUAAABQWTxu2OTBgwfdHUKZ+fn5acmSJRowYIBiYmI0aNAgBQUFKTs7W6mpqZJyJmaZP39+iet+//33NWTIEG3dulUfffSRPvroIwUFBSk9Pd1peOiDDz5Yol49AAAAAJ7N45K35s2buzuEchEZGamff/5ZM2bM0Oeff66DBw/K399fHTp00E033aT77rtPNWrUKHG99erV06ZNmzR37lwtXrxYO3bs0JkzZ+Tn56dmzZrp0ksv1R133KGoqKgKuCoAAAAA7mIZ5pJHOahTp46knAW9AQDwNMnJyfYkXklJSZLktM894gBc5c7PvR55zxsAAAAAwBnJGwAAAAB4AY+7560wcXFx+vHHH/XXX3/p7NmzSklJUVhYmO699153hwYAAAAAFc6jk7eMjAx99NFHeuutt7Rt27Z80/+3bNkyX/KWlpamUaNGKT09XX5+flq4cKGCgoIqM2wAAAAAKHce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5XpjYmLUokULDRw4UOPGjdOgQYPUqFEjZWdna9++fXr88cf11VdfSZKefPJJ/fOf/6yoS8yH5A0APAvJmzOSNwDlheStghhjZFlWpSdv7733nv72t79JkjZs2KBevXo5Hf/444918803S5K+++47DRw40KV64+Pj9ccff6hr164FHjfG6Morr9SyZcsUEhKikydPqmbNmmW4EteRvAGAZyF5c0byBqC8VMulAowxFf7jLnPnzpUkDRgwIF/iJkmjR49WixYtJJVsCGloaGihiZskWZaliRMnSsp5I9q7d29JwgYAAADgwdySvGVnZ1faT2X3uqWkpGj9+vWSpKFDhxZYxrIsDRkyRJK0YsWKcn1+x562yr52AAAAABWH2SbL2d69e5WdnS1J6tixY6Hlco8dO3ZMZ86cKbfnj46OliTVqFFDbdq0Kbd6AQAAALiXn7sDqGqOHDlibzdu3LjQco7Hjhw5ovDw8DI/98GDB/X2229LkkaNGqXatWuXuU7pf+N6ixIfH6/Q0NByeT4AAFyRe4tEZU6CBgDuRM9bOUtMTLS3g4KCCi3neMzxnNI6d+6cbrzxRqWkpKhu3bp67rnnylwnAACeyhijqKgo9enTx633uQNAZaLnrQrIzMzUzTffrK1bt8rf318LFiwostevpFyZSceV3jkAAMpLSkqKNmzYYG8zWySA6sBrkre4uDj9+OOP+uuvv3T27FmlpKQoLCxM9957r7tDc1KrVi17OyUlpdByjscczymprKwsjR07Vl9++aX8/Py0YMECDR48uNT1AQAAAPBMHp28ZWRk6KOPPtJbb72lbdu25RsW0bJly3zJW1pamkaNGqX09HT5+flp4cKFRQ5fLG+NGjWyt2NjY9W5c+cCy8XGxhZ4TknkJm6LFi2Sr6+vPvroI91www2lqgsAAACAZ/PYe962b9+url276m9/+5u2bt2q7Oxsl9ZxCwgIUGhoqJYtW6ZvvvlGn332WaXG3b59e/n45DTrrl27Ci2XeywiIqJUk5VkZWVpzJgxWrhwoZ24jRo1qnRBAwAAAPB4Hpm8rV27Vn369NGePXucEjV/f3/Vr1+/2PNzF6qWVOnJW1BQkHr37i1JWrZsWYFljDFavny5JJVqiGNu4ubY4zZ69OjSBw0AQBVQ1Je7AFAVeFzydvToUQ0fPlwpKSkyxsjf31933323Nm/erOTkZB07dkxS0dMC9+nTR3Xr1pUxRtHR0fa6a5Vl/PjxkqQ1a9Zo8+bN+Y4vXrxYBw4ckCSNGzeuRHVnZWXp5ptv1qJFi+Tn56f58+eTuAEAqj1mnwRQHXhc8vbYY48pISFBlmWpQYMG2rRpk9544w11795dfn6u3aLn4+OjXr16ScqZhn/v3r0VGXI+48ePV6dOnWSM0fXXX69Vq1ZJkrKzs7V48WJNmjRJkjR06FANHDjQ6dypU6fKsixZlqWYmBinY1lZWbrlllv0ySef2JOTMFQSAID/zT65fv36IicMAwBv5lHJW0pKij755BNJOQnYV199pS5dupSqLseJQvbt21cu8bnKz89PS5YsUWRkpGJjYzVo0CAFBwcrODhYI0eOVEJCgrp06aL58+eXqN7169fr448/lpTT83jfffcpIiKi0J9FixZVxOUBAAAAcAOPmm0yOjpaqampsixLQ4cOVY8ePUpdV0REhL199OjR8givRCIjI/Xzzz9rxowZ+vzzz3Xw4EH5+/urQ4cOuummm3TfffepRo0aJarTcfhnRkaGjh8/XmT5c+fOlSp2AAAAAJ7Ho5K3w4cP29sDBgwoU121a9e2txMTE8tUV2nVqlVLzzzzjJ555hmXz5k6daqmTp1a4LH+/fszjh8AAACopjxq2GRcXJy9XZrp8x05jncPCAgoU10AAAAA4G4elbyFhYXZ26dOnSpTXY69ePXq1StTXQAAAADgbh6VvDVq1Mje3rRpU5nq+uGHH+ztVq1alakuAAAAAHA3j0reoqKi5OvrK2OMvvnmGx05cqRU9ezatUsbNmyQJIWEhKhnz57lGSYAAAAAVDqPSt7CwsIUFRUlSUpLS9OECROUlZVVojoyMzPtddQsy9KIESPk6+tb7rECAAAAQGXyqORNktPMjKtWrdLgwYP1119/uXTuqVOndOWVV2rz5s2SctaKe+KJJyokTgAAAACoTB6XvPXt21cTJ060p8SPjo5W69atdfPNN2vBggXasWOHU/njx49r9erVmjx5slq1aqVVq1ZJyul1e/zxx9W2bdvKvgQAAAAAKHeW8cCFw7KysjRixAh9++23sixLxhhZlmUfzw3Z8bHcx3PLjx49WgsWLKjUuKuzOnXqSHJe7gEA4D7JyckKCQmRJCUlJSk4ONjNEZWvvNcnqcjrLWl5ACiMOz/3elzPmyT5+vpqyZIlevrpp+Xj4xxiboKWm7gZY5wWrvbx8dHUqVNJ3AAAAABUKR6ZvEk5SdjTTz+t/fv3695771XdunXtJC03YXNM2mrXrq3bbrtNe/fu1ZQpU9wVNgAAAABUCI8cNlmYffv2aefOnTp9+rTi4uIUFBSkevXqqV27duratWu+XjpUHoZNAtVHYUPX4VkYNsmwSQAVw52fe/0q/RnLoF27dmrXrp27wwCAassYo6ioKFmWpbVr15LAAQBQiap0V9WBAwc0YcIEd4cBAFVGSkqKNmzYoPXr1yslJcXd4QAAUK1UyeTt0KFD+tvf/qb27dvrww8/dHc4AAAAAFBmXjVssjh//fWXnn32Wc2ZM0cZGRn5lhgAAAAAAG/lUclbZmamDh06pFOnTsnf318tWrRQWFhYsecdPXpU//73v/Xuu+8qPT2dpA0AAABAleMRwya3bdum6667TuHh4WrTpo0uvfRSde/eXfXq1VO3bt30ySefFHheSkqKpk6dqjZt2mjmzJlKS0uzjxlj1L17d3322WeVdRkAICn/+pPVTXW/fgAAKorbe95efvllPfzww4W+2W/btk033XSTVq5cqdmzZ9uPb968WTfffLNiYmKcetqMMRowYIAee+wxDRo0qNKuAwAkZmOs7tcPAEBFcmvytmjRIj344IOSctYLsizLKYFzTMjef/99tW/fXv/4xz/0xRdfaPTo0crMzHSqb/jw4Xr88cfVs2fPyrsIAHCQOxtj7nZ1Wzuqul8/AAAVyW3JW3p6uv7v//5PkuykrXbt2urVq5fq1q2rU6dOaePGjUpMTLSP//Of/1SfPn100003KTMz0+5xGz16tJ544gl16NDBXZcDAPACLDAOAPBmbkvevvzyS508edJ+A7333nv1/PPPKygoyC6TnJysRx55RDNnzpRlWUpISNDw4cOVnp4uSerVq5feeustde7c2S3XAADwHgzpBAB4O7clb8uXL7e3r776ar322mv5ygQHB+uNN97QX3/9pSVLlsiyLJ04cUKWZemee+7Rq6++Kh8fj5hzBQDg4RjSCQDwdm7LfLZv325vP/zww0WWfeSRR+xty7LUq1cvvfbaayRuAAAAAKoNt2U/sbGxkqSAgIBiJxjp0aOHAgIC7HsV/vGPf1R4fAAAAADgSdyWvCUkJMiyLNWrV6/YHjRfX1+dd9559n7Xrl0rOjwAAAAA8ChuS95yF9SuWbOmS+UDAgLs7aZNm1ZITAAAAADgqbzypjFfX193hwAAAAAAlcorkzcAAAAAqG5I3gAAAADAC7htnbdciYmJmjdvnkvlcrlS3tG4ceNKHBcAoOrLncWYBbsBAN7A7cnbiRMndOutt7pc3hhTovISyRsAID9jjKKiomRZltauXUsCBwDweG5P3qT/ffNZFMuy7DdWV8sbY3gzBlDhqlrvTVW7nsKkpKRow4YN9nZwcLCbIwIAoGhuTd5cScJKU7Y05QGgNPL23ng7eqMAAPBcbkvePvjgA3c9NQCUm7y9N96O3igAADyX25K38ePHu+upAQBVVHUZ8llatA8AeDeWCgAAVAm5Qz779OnD0PkC0D4A4P08YsISAADKqjyGfFblnimGxAKA96PnDQBQZRljXO5lqgo9UyW5XgCA96HnDQBQJZV0JlBv75mqajOfAgDyI3kDAFRJVW0m0OJUt+sFgOqIYZMAUM0x1A4AAO9A8gYA1VhVuM8LAIDqgmGTAFCNuTLUrirPwAgAgDeh5w0AUCh65gAA8Bz0vAFACXlbT1RZ4k1OTvbaSTAck01jjNf8vhx522sNAFCx6HkDgBLwtp6ossRrjNGgQYMqKLKK55hselviKRX8u8s7uQyTzaAovD6AqoeeNwAoAW+bjr24tcuK6p1KSUnR5s2bKydQ5JP3dxcUFJRvHTfWdUNh8q77R+8tUDXQ81aBEhMTNXXqVHXq1EkhISEKDQ1V9+7d9dJLLyk9Pb1MdR8/flwPPPCA2rZtq8DAQIWHh6tPnz569913+ZYNKGdV+dvr5ORke9sbktHqLDeZW79+vVJSUvLtVwdV+f9ieauOrw+gOqDnrYIcOnRI/fv3V0xMjCQpKChIaWlp2rJli7Zs2aL58+dr1apVCgsLK3HdW7du1RVXXKHTp09LkkJCQpSYmKh169Zp3bp1Wrx4sZYsWaKAgIDyvCSgWsr77XVBxx23venbbWOMhg0b5u4wyqQq3xNW0teWN78WXVHc/0UUryr/fwGqC3reKkBWVpaGDx+umJgYNWzYUCtXrlRycrJSUlK0cOFC1apVS9u3b9eYMWNKXHd8fLyGDRum06dPq127dvrpp5+UmJio5ORkvfHGG/L399eKFSs0efLkCrgywDVl/Xbck75dL+7ba1fuq/Kk65H+F09KSoq2bNlSovM8ibfdf1hSJb1nz9vv8SsOPUllU9X/vwDVBclbBZgzZ45++eUXSdJnn31m3/Dv4+OjUaNGadasWZKkpUuXatWqVSWqe8aMGTp27JgCAwP17bffqlu3bpKkGjVq6J577tEzzzwjSXrnnXe0f//+8rokwGWuTLJQ0vMrW3kmW55wPSWJp6gYPe0DMx/mi5a3J6468rQvTtyJ/y/ehdcuCkPyVgHmzp0rSRowYIB69eqV7/jo0aPVokULSdK8efNKVHduecc6HN13330KCQlRVlaW5s+fX9LQ4SU8+Y963g8IriRz2dnZys7OLvD8ylbSZKu4D8gFXU9xv7+yHi9KUe1rjNHll19e4jrLO9ktajZFx/3KSE4q+/9aSb/oKGg7V1XoiSuqPYq7/tJ8ceLJf1td4c3xe3Ps5c3TvvTzRNX59ULyVs5SUlK0fv16SdLQoUMLLGNZloYMGSJJWrFihct1//rrrzp8+HCRdYeEhKhPnz4lrtvbefp/4pJ+GC8quSlrz1ZplCWZKC6Zy87OVp06dVSnTh37GvNyvP6Cnq88h2kWFK9juYKur6Dtgs7JfZ7evXsrKirKPlaS329ZksvipKSkaNOmTUWWyfs7yszM1KWXXur0+3SUlZWlzMxMp2vNyspy6dqK2y9pcpL3d+EYa3Z2doG/q0svvVS9e/e2j2VmZiozM9Pp+h33s7KylJWVVeh+ccloSX63jpPNJCcnF3t9efclKSMjQxkZGYVeT3lfb17FtUfe9ndU3O8/d43C9evXO7VVUbHk/b9Z3PUV97eppAr6PTn+bcjKyiryuGN7ufLlRt7ny3t9eVXUe40r72u5r2lX3/fK+r7rTqX50q86qe7JLROWlLO9e/fafwg7duxYaLncY8eOHdOZM2cUHh5ebN27du3Kd35hdS9dulR79uxxNWyvlvuf2FOnQy4uvrzHJefpv40xqlOnjiQpLi5O586dK3L68PK+/tLEn/e443be6c+TkpKUmJgoSTp58qTTVPaOyV3u9VuWVWR7lfT6i4s/7wfkkJCQIq8v7wcrx/OTkpIkSRs3brTrCwoKcro+x/ZJTk5WcHCwU3zFTf2fN7aBAwc67Tu2T3FvenkTsezsbDVq1Mjez8rKUkBAgF0uMTFRjRs3djpeo0YNZWdnq1evXlq7dq3CwsKUkpKiHj16aN26derTp0+h1yapyP2iPngV97tITk62fx+SdOLECae2TEpKUlZWlp3MJiQkKDg4WP7+/pJkJzyO+5ZlqUaNGrIsS2lpaZLktO/j41Pkazfv9Rd3fXmvx1Hufda5Tp065VTmxIkTqlmzpmrUqCFJSk9Pl2VZRV5fWa+3pH/7kpKS7PZPSkrK99rN+/vNm2Q5Xn9SUpKCgoKcjjvWl52draSkJPv/Zm75oq7Psqwi/zaV9G9R3r91kuz9s2fPqm/fvtq8ebMCAwMVHx/vdDwuLk7JyclO7eV4/bl/S/K2n+P5xhin6/P19XWKryLfa3MTbcdY8742evfurV27dqlz58764YcfnP52FPfaKulrz9s+R1Q3JXkfrIpI3srZkSNH7G3HDzF5OR47cuSIS8lbSetOSEhQUlJSvg+bJZX7x70oed9IKlvu85dm9s7KUFx8eY877htj7OQmLCzM6Y927u+6oq+/pPE7xuf4gbNx48b54nf8ANa6desCry/v9RfVXqVRVPx54/Px8Sn0+EUXXZTvfEdt2rQp9vrynl/Q9RZWf1HX5lif4/U4uvDCC/PFm3ffMeFp0qSJ0/U3adKk0OMbN25UWFiYfa25+wkJCS5dW0H7xb12HF97ea+ldevWTscvuugip/PbtGnjdLxJkyZOx/P+zc7dz40p93oc9318fFx+7Zb0+vK+9i666CKn43mH8OctHx4e7tL1lfV68yqqPRyvv6C/HUX9fps0aeK0X9zxwl5vRV2fZVnF/m0qibx/6yXnvw2520lJSQUez/u31pErf1sdE+Lc319eFfVeU9D7RGGvjfXr1xf5t8PVWMv7faSiVNb7vLdy5X2wIsTHx7stibZMdexvrEALFiywZ5H87bff1KpVqwLLrVy5UoMHD5aU801yQffG5fXvf/9bTzzxhKScbz39/ArOvWfPnq3bb79dUk7C17BhwxJfhyNXkzfLslS7du0yPZdjfZIUGhpaLvVVN7Rf2dB+pUfblQ3tVza0X+nRdmVD+5WNt7VfQkKCfHx8nIaRVxZ63lCs3OEblSnv0BGUDO1XNrRf6dF2ZUP7lQ3tV3q0XdnQfmVD+7mOCUvKWa1ateztom6gdzzmeI676gYAAADg2UjeypnjzfyxsbGFlnM85nhOedZdu3btMt/vBgAAAMAzkLyVs/bt29s3+TrODplX7rGIiAiXJiuRnGeYdKXuCy64wKV6AQAAAHg+krdyFhQUpN69e0uSli1bVmAZY4yWL18uSfakJa5o27atmjVrVmTdycnJ9rS3JakbAAAAgGcjeasA48ePlyStWbNGmzdvznd88eLFOnDggCRp3LhxJao7t/zChQsVExOT7/ibb76ppKQk+fr62rNeAgAAAPB+JG8VYPz48erUqZOMMbr++uu1atUqSTnrwyxevFiTJk2SJA0dOtRpAV1Jmjp1qizLkmVZBSZnDz74oCIiIpSSkqKrrrpKW7dulZSzwOpbb72lp556SpJ0++2351vXBgAAAID3YqmACuDn56clS5ZowIABiomJ0aBBgxQUFKTs7GylpqZKkrp06aL58+eXuO7Q0FB9/fXXuuKKK7Rnzx5169ZNtWrVUmpqqjIyMiTlDJd85ZVXyvWaAAAAALgXPW8VJDIyUj///LOmTJmijh07yrIs+fv76+KLL9aMGTO0adMmhYWFlaruiy++WLt379bkyZPVunVrZWRkKDg4WFFRUZo9e7aWLl2qgICAcr4iAAAAAO5kGWOMu4MAAAAAABSNnjcAAAAA8AIkbwAAAADgBUjeAAAAAMALkLwBAAAAgBcgeQMAAAAAL0DyBgAAAABegOQNAAAAALwAyRsAAAAAeAGSNwAAAADwAiRvAAAAAOAFSN4AAAAAwAuQvAEAAACAFyB5AwAAAAAvQPIGAAAAAF6A5A0AAAAAvADJGzxKYmKipk6dqk6dOikkJEShoaHq3r27XnrpJaWnp7s7PLc5ffq0PvjgA40dO1YXXHCBgoODFRAQoCZNmuiaa67RF198UWwdx48f1wMPPKC2bdsqMDBQ4eHh6tOnj959910ZYyrhKjzL888/L8uy7J+i0HY5EhIS9MILL+jSSy/VeeedZ78GBwwYoKlTpyouLq7A82g/aeXKlRo5cqSaN2+umjVrKjAwUOeff77GjBmj77//vshzq3L7paSkaOnSpXr22Wd13XXXqXnz5vb/yalTp7pUR1nb548//tAdd9yhFi1aqGbNmqpfv76uuOIKffbZZ2W8uopVlraLjY3VzJkzdeONN6pVq1YKDAxUYGCgWrRooZtuukmrV692KQZvbTupfF57ed155512HZGRkcWWp/2kY8eO6amnntLFF1+s8PBwBQYGqnnz5hoyZIief/55ZWRkFHquN7dfmRjA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P6pnz5765JNPFB8fr8DAQP31119atGiRevfubX+2cVTd208ieYMHSExMtLeL+o/oeMzxnOosOztbt9xyi44ePaqAgAC9/vrrTsdp2xx33HGH4uPjNXXqVHsYW3FoO+ns2bP29nPPPSd/f399/PHHSkpK0tmzZ3X48GGNHj1akvT222/rP//5j12e9vuf+++/X59//rnq168vSTp37pw97CctLU2JiYmKj493Oof2K1pZ2yd3u6hzHY9Xl7Y9d+6cbrzxRqWkpKhu3boFfnim7aTMzExNnDhRmZmZeu211xQWFubyudW9/RzfV5555hk1aNBAy5YtU3JysuLi4rR3714NHDhQxhg9/vjj+vLLL53Or+7tJ5G8AV7t73//u77++mtJ0syZM3XhhRe6OSLP89FHH+mbb77RRRddpH/84x/uDser5A5nzt1+++23NXr0aPn7+0uSmjZtqvnz56tLly6SpGeffbbA+7qqs5SUFI0aNUrDhg1Ts2bNtGLFCp06dUonT57UihUr1KFDB3300Ufq0aOHfv75Z3eHi2osMzNTN998s7Zu3Sp/f38tWLCgyF7N6uz555/Xjh07NGzYMI0cOdLd4XiVvO8rixcv1hVXXCEfn5yUpF27dvrqq6/UqFEjSSr1gulVGckb3K5WrVr2dkpKSqHlHI85nlNdPfjgg3rjjTckSa+88oomTpyYr0x1b9sTJ07o/vvvl6+vr2bPni0/Pz+Xz63ubSc5X0/Tpk01atSofGV8fHz0wAMPSJJOnTqlrVu35ju3urafJD300EP65JNP1KZNG/3www+6/PLLVbduXdWrV0+XX365fvjhB7Vp00anTp3SPffcY59H+xWtrO2Tu13UuY7Hq3rbZmVlaezYsfryyy/l5+enBQsWaPDgwQWWre5tt2fPHv3zn/9USEiIZs6cWeLzq3v7OV5PVFSULrnkknxlgoODdffdd0vKmezp+PHj+c6vru0nkbzBA+R+uyLl3JtUGMdjjudURw8//LBeeuklSdL06dN1//33F1iupG1bu3ZthYSElF+gbvbII4/o9OnTuv3229WuXTslJSU5/eTezyUp32PVve0k53uJ2rVrV2i53Fm9JOnQoUOSaD8pZ7jOO++8I0m69957FRgYmK9MYGCg7r33Xkk5s6idOHFCEu1XnLK2T+75Z8+eLfJDYO75Vfk9JzdxW7RokXx9ffXRRx/phhtuKLR8dW+7e+65R+np6XriiScUFhaW730ld/SBMcZ+LCMjwz6/uref4/uK43tHXgW9r0i0n0TyBg/Qvn17u7vccRahvHKPRUREKDw8vFJi80QPPfSQpk+fLkl68cUX9eCDDxZa1nEWNlfa9oILLiinKD3DwYMHJUlvvfWWatWqle/H8X6O3McefvhhSbSdJIWHh9tvtJZlFVrOGGNv55aj/XJuzM/9INeyZctCy7Vu3drezn3N0n5FK2v7OJ5f1Gx0uecXNaudN8vKytKYMWO0cOFCO3ErqIfdUXVvu9z/o4899liB7yvz58+XJB0+fNh+7M0337TPr+7td8EFF8jX11dSyd9XJNpPInmDBwgKClLv3r0lScuWLSuwjDFGy5cvl6RCh3JUBw8++KBmzJghKSdxe+ihh4os37ZtWzVr1kxS4W2bnJystWvXSqrebZsXbZcj97r27t3r9GbqaO/evfZ2ixYtJNF+kuwvpSTnb47zKmhIEO1XtLK2T1RUlN0TWtj5hw4dsl/bVbF9cxM3xx633AmIikLblU11b7+aNWuqb9++kope4iT3+i3LUmRkpP14dW8/SZIbFwgHbO+++66RZCzLMps2bcp3fNGiRUaSkWS+++47N0Tofg888IDdBjNmzHD5vCeffNJIMkFBQebgwYP5jr/wwgtGkvH19TW//vprOUbs+Z5++mm7TQtC2xnzww8/2G308ccf5zuelZVlunTpYiSZxo0bm6ysLPtYdW+/lJQUExgYaCSZrl27moyMjHxlMjMzzaWXXmokmbCwMJOZmWkfq67t17x5cyPJPP3000WWK2v7jB071kgyDRs2NHFxcfmO33XXXUaSqVWrljlz5kxpL6dSudp2mZmZZuTIkUaS8fPzMwsXLizR81TFtjPG9fYryvjx440k07x580LLVPf2mzdvnv2+smHDhnzHk5OTTaNGjYwkc8kll+Q7XlXbz1Ukb/AIGRkZplOnTvYHwNwELSsry3zyySemdu3aRpIZOnSomyN1j4cfftj+Q/fyyy+X6Ny4uDgTERFhJJkLLrjAbNmyxRhjTFpampk5c6apUaOGkWTuuuuuigjdoxWXvNF2OW644QYjydSpU8csXLjQpKenG2OMOXz4sBk9erTdhnPmzHE6j/Yz5r777rPbZ8iQIebnn382WVlZJisr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",
      "text/plain": [
       "<Figure size 900x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot the output\n",
    "fig = plt.figure(figsize=(3, 2), dpi=300)\n",
    "for k, v in mass_to_obj.items():\n",
    "    # Plot verticle line from k to v['inten']\n",
    "    plt.plot([k, k], [0, v[\"inten\"]], color=\"black\", linewidth=0.5)\n",
    "    # Can also get the frag id if we want to plot one of these in particular\n",
    "\n",
    "plt.xlabel(\"m/z\")\n",
    "plt.ylabel(\"Relative Intensity\")\n",
    "plt.title(\"Mass Spectrum\")\n",
    "# Set ylim\n",
    "plt.ylim(0, 1.1)\n",
    "plt.tight_layout()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "ms-gen",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.0"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
